package medOffice.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import medOffice.Medico;
import medOffice.Enuns.Sexo;
import medOffice.Enuns.TipoDeConsulta;

/**
 * Classe que inicializa o BD do Medico.
 * @author Tiago Leite - tiagohsl@lcc.ufcg.edu.br
 * @version 1.0 </br> 03/12/09
 *
 */
public class MedicoDAO {

	protected Connection conexao;
		
	/**
	 * Construtor default da classe
	 */
	public MedicoDAO(){
		conexao = ConnectionFactory.getConnection();
		procedimento();

	}
	
	/**
	 * Construtor da classe
	 * @param Connection conexao
	 */
	public MedicoDAO(Connection conexao){
		this.conexao = conexao;
		procedimento();
	}
	
	/**
	 * Metodo que cria a tabela do Medico caso nao exista
	 * e realiza a connexao com o BD
	 */
	private void procedimento(){
		PreparedStatement stmt;
		
		String sql = 
			"create table if not exists Medico(cpfMedico varchar(15) primary key, nomeMedico varchar(50)," +
					"telefoneMedico varchar(25), emailMedico varchar(25), enderecoMedico varchar(50)," +
					"sexo varchar(5), dataNascimento date, tempoConsulta time, tempoRetorno time)";

		try {
			stmt = conexao.prepareStatement(sql);
			stmt.execute();
			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	/**
	 * Metodo que cria um medico.
	 * @param Medico medico
	 * @throws SQLException
	 */
	public void create(Medico medico) throws SQLException {
		String sql = "insert into Medico(cpfMedico, nomeMedico," +
				" telefoneMedico, emailMedico, enderecoMedico, sexo," +
				" dataNascimento, tempoConsulta, tempoRetorno)" +
				" values (?,?,?,?,?,?,?,?,?)";

		PreparedStatement stmt = conexao.prepareStatement(sql);

		stmt.setString(1, medico.getCPF());
		stmt.setString(2, medico.getNome());
		stmt.setString(3, medico.getTelefone());
		stmt.setString(4, medico.getEmail());
		stmt.setString(5, medico.getEndereco());
		stmt.setString(6, medico.getSexo().getNome());
		
		java.util.Date dataUtil = medico.getDataDeNascimento().getTime();
		java.sql.Date dataSql = new java.sql.Date(dataUtil.getTime());
		stmt.setDate(7, dataSql);
		
		stmt.setTime(8, medico.getTempoConsulta());
		stmt.setTime(9, medico.getTempoRetorno());		
		
		stmt.execute();
		stmt.close();
	}
	
	/**
	 * Metodo que fecha uma conexao com o banco de dados.
	 * @throws Exception
	 */
	public void closeConnection() throws Exception{
		conexao.close();
	}
	
	/**
	 * Metodo que recupera todas as informacoes do medico.
	 * @throws SQLException
	 */
	public void recuperaDadosMedico() throws SQLException {
		PreparedStatement stmt = conexao.prepareStatement("select * from Medico");
				

		ResultSet rs = stmt.executeQuery();		

		List<Medico> medicos = convertePesquisaEmLista(rs);
		
		for(Medico med: medicos){
			System.out.println("Nome: " + med.getNome() + " | Telefone: " + med.getTelefone() + 
					" | Email: " + med.getEmail() + " | Endereco: " + med.getEndereco() +
					" | Cpf: " + med.getCPF() + " | SEXO: " + med.getSexo() +
					" | DataNascimento: "+ new SimpleDateFormat().format(med.getDataDeNascimento().getTime()) + 
					" | Tempo da consulta: " + med.getTempoMinutos(TipoDeConsulta.CONSULTA) + 
					" | Tempo do retorno: " + med.getTempoMinutos(TipoDeConsulta.RETORNO));
		}
		
		rs.close();
		stmt.close();
	}
	
	/**
	 * Metodo que deleta o medico usando o seu cpf como chave.
	 * @param String cpf
	 * @throws SQLException
	 */
	public void delete(String cpf) throws SQLException {
		String sql = "delete from Medico where cpfMedico=(?)";
		PreparedStatement stmt = conexao.prepareStatement(sql);

		stmt.setString(1, cpf);		
		
		stmt.execute();
		stmt.close();		
	}
	
	/**
	 * Metodo que atualiza o cpf do medico.
	 * @param String cpf
	 * @param String novoCpf
	 * @throws SQLException
	 */
	public void update(String cpf, String novoCpf) throws SQLException {
		
		String sql = "update Medico set cpfMedico=(?) where cpfMedico=(?)";
		PreparedStatement stmt = conexao.prepareStatement(sql);

		stmt.setString(1, novoCpf);
		stmt.setString(2, cpf);
		
		stmt.execute();
		stmt.close();
		
	}
	
	/**
	 * Metodo que atualiza os dados do medico.
	 * @param Medico medico
	 * @param String cpfAnterior
	 * @throws SQLException
	 */
	public void editaMedico(String cpfAnterior, Medico medico) throws SQLException {		
		String sql = "update Medico set cpfMedico=?, nomeMedico=?," +
				"telefoneMedico=?, emailMedico=?, enderecoMedico=?" +
				"sexo=?, dataNascimento=?, tempoConsulta=?, tempoRetorno=? where cpfMedico = ?";
		PreparedStatement stmt = conexao.prepareStatement(sql);
		stmt.setString(1, medico.getCPF());
		stmt.setString(2, medico.getNome());
		stmt.setString(3, medico.getTelefone());
		stmt.setString(4, medico.getEmail());
		stmt.setString(5, medico.getEndereco());
		stmt.setString(6, medico.getSexo().getNome());
		
		java.util.Date dataUtil = medico.getDataDeNascimento().getTime();
		java.sql.Date dataSql = new java.sql.Date(dataUtil.getTime());
		stmt.setDate(7, dataSql);
		stmt.setTime(8, medico.getTempoConsulta());
		stmt.setTime(9, medico.getTempoRetorno());
		stmt.setString(10, cpfAnterior);
		
		stmt.executeUpdate();		
		
	}	

	/**
	 * Metodo acessador que resgata o medico.
	 * @return Medico medico.
	 * @throws SQLException 
	 */
	public Medico getMedico() throws SQLException {
		PreparedStatement stmt = conexao.prepareStatement("select * from Medico");
		ResultSet rs = stmt.executeQuery();
		List<Medico> medicos = convertePesquisaEmLista(rs);
		
		if(medicos.size() > 0)
			return medicos.get(0); 
		return null;
	}
	
	/**
	 * Metodo que recebe uma pequisa em banco de dados
	 * e retorna uma lista de medicos
	 * @param ResultSet rs
	 * @return List<Medico>
	 * @throws SQLException
	 */
	public List<Medico> convertePesquisaEmLista(ResultSet rs) throws SQLException{
		List<Medico> medicos = new ArrayList<Medico>();
		
		while (rs.next()) {
			try {
				Medico medico = new Medico(rs.getString(2),rs.getString(1));
				medico.setEmail(rs.getString(4));
				medico.setEndereco(rs.getString(5));
				medico.setTelefone(rs.getString(3));
				medico.setSexo(Sexo.valueOf(rs.getString(6)));
				medico.setDataDeNascimento(PacienteDAO.conversorData(rs.getDate(7).toString()));
				medico.setTempoConsulta(rs.getTime(8));
				medico.setTempoRetorno(rs.getTime(9));

				medicos.add(medico);
			} catch (Exception e) {				
				e.printStackTrace();
				return null;
			}
			
		}
		rs.close();
		return medicos;
	}
	
}
